package cn.fornever.tools.svn;

import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNLogEntry;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
import cn.fornever.tools.svn.assist.SVNFilter;

import java.util.*;

/**
 * svn操作工具类.
 *
 * @author ZhangAY
 */
public class SVNUtil {

    static {
        /*
         * 对版本库进行初始化操作
         * 对于通过https或http访问svn时,执行DAVRepositoryFactory.setup();
         * 对于通过使用svn:// 和 cn.fornever.tools.svn+xxx:// 访问svn时,执行SVNRepositoryFactoryImpl.setup();
         * 对于通过file:/// 访问svn的情况,执行 FSRepositoryFactory.setup();
         */
        DAVRepositoryFactory.setup(); // 初始化
        SVNRepositoryFactoryImpl.setup();
        FSRepositoryFactory.setup();
        SVNWCUtil.createDefaultOptions(true); // 驱动选项
    }

    private SVNUtil() {

    }

    /**
     *
     * @param url svn仓库的地址
     * @param username 用户名
     * @param password 密码
     * @return url对应的svn仓库信息
     * @throws SVNException SVNException
     */
    public static SVNRepository getRepository(String url, String username, String password) throws SVNException {
        SVNURL svnurl = SVNURL.parseURIEncoded(url); // 某目录在svn的位置,获取目录对应的URL。即版本库对应的URL地址
        ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(username, password); // 提供认证
        SVNRepository repos = SVNRepositoryFactory.create(svnurl);
        repos.setAuthenticationManager(authManager); // 设置认证
        return repos;
    }

    /**
     *
     * @param logEntries 日志对象
     * @param filter 过滤条件
     * @return 日志
     */
    public static List<SVNLogEntry> getFilteredLogs(Collection logEntries, SVNFilter filter) {
        List<SVNLogEntry> result = new ArrayList<>();
        for (Iterator entries = logEntries.iterator(); entries.hasNext(); ) {
            SVNLogEntry logEntry = (SVNLogEntry) entries.next();
            if (filterLog(logEntry, filter)) {
                result.add(logEntry);
            }
        }
        return result;
    }

    private static Boolean filterLog(SVNLogEntry logEntry, SVNFilter filter) {
        if (filter.getStartReversion() > logEntry.getRevision() || (filter.getEndReversion() > 0 && filter.getEndReversion() < logEntry.getRevision())) {
            return false;
        }
        if (filter.getStartDate() != null && filter.getStartDate().getTime() > logEntry.getDate().getTime()) {
            return false;
        }
        if (filter.getEndDate() != null && filter.getEndDate().getTime() < logEntry.getDate().getTime()) {
            return false;
        }
        if (filter.getUsername() != null && filter.getUsername().length > 0) {
            boolean has = false;
            for (String name : filter.getUsername()) {
                if (logEntry.getAuthor().equals(name)) {
                    has = true;
                    break;
                }
            }
            if (!has) {
                return false;
            }
        }
        return true;
    }
}
